package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itheima.reggie.common.BaseContext;
import com.itheima.reggie.common.CustomException;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.ShoppingCart;
import com.itheima.reggie.service.ShoppingCartService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.List;


/**
 * @author ：石破天
 * @date ：Created in 2022年11月25日
 * @description ：
 * @version: 1.0
 */
@RestController
@RequestMapping("/shoppingCart")
@Slf4j
public class ShoppingCartController {

    @Autowired
    private ShoppingCartService shoppingCartService;

    @PostMapping("/add")
    public R<ShoppingCart> add(@RequestBody ShoppingCart shoppingCart){
        log.info("shoppingCart接收前端传递的购物项数据:"+shoppingCart);

        // 是不是 就开始解析 把shoppingCart存到数据库
        // shoppingCart数据不全
        // 1: 这个购物项属于谁 缺少 用户id
        // 用户指的是 当前登录的用户
        Long userId = BaseContext.getCurrentId();
        // 因为在登录校验哪里 存过id
        shoppingCart.setUserId(userId);

        // 2: 这个购物项 在当前用户这里 点了几份 ?
        /*
          比如点了一份
               {
                  "amount": 100,
                  "setmealId": "1595329755989610497",
                  "name": "防脱套餐",
                  "image": "f365d958-0e1c-445f-a09c-d5840e500437.png"
                }
           这个套餐 在购物项中 是点了还是没点
             如果点了 份数+1      更新
             如果没点 增加一份    添加
         */
        /* 查询这个用户  是不是有 添加过 该套餐/菜品
         select * from shopping_cart where user_id=用户id and setmeal_id =?
          如果这个添加的是套餐 查询 该用户购物项中该套餐
          如果返回的是null 说明 没有该套餐 套餐是第一次出现在该用户的购物车中
          如果返回的不是null 说明该套餐已经加入到购物车中,获取的就是 之前的套餐购物数据.
         select * from shopping_cart where user_id=用户id and dish_id =?
          如果这个添加的是菜品 查询 该用户购物项中该菜品
          如果返回的是null 说明 没有该菜品 菜品是第一次出现在该用户的购物车中
           如果返回的不是null 说明该菜品已经加入到购物车中,获取的就是 之前的菜品购物数据.*/
        // 创建一个 条件构造器
        LambdaQueryWrapper<ShoppingCart> wrapper = new LambdaQueryWrapper<>();
        // 不管下面两个sql语句是套餐还是菜品  都有   where user_id=用户id
        wrapper.eq(ShoppingCart::getUserId,userId);// select * from shopping_cart where user_id=用户id

        // 如果 添加的是 菜品 就拼接  and dish_id =?
        if(shoppingCart.getDishId()!=null){//就是菜品
            wrapper.eq(ShoppingCart::getDishId,shoppingCart.getDishId());
        }else{//就是套餐
            // 如果 添加的是 套餐 就拼接  and setmeal_id =?
            wrapper.eq(ShoppingCart::getSetmealId,shoppingCart.getSetmealId());
        }
        // 查询
        ShoppingCart one = shoppingCartService.getOne(wrapper);// 一个菜品id/套餐id 只有一个购物项
        // one 这个购物项是一定存在的吗?  根据菜品id/套餐id 查询 有没有该菜品id/套餐id 对应的购物项
        if(one==null){//说明没有
//            shoppingCart 就是要添加的数据 份数是1份
            shoppingCart.setNumber(1);
            // 创建时间没有做自动填充 手动写
            shoppingCart.setCreateTime(LocalDateTime.now());
            // 完成添加
            shoppingCartService.save(shoppingCart);
        }else{// 说明原来数据库有 该购物项
            // one 是原来的数据!!!!
            // 对one进行更新!!!!!!
            one.setNumber(one.getNumber()+1);
            // 更新到数据库
            shoppingCartService.updateById(one);//对one进行更新
            // 上面两行代码是对数据库的数据进行更新
            // 返回的内容和数据库更新的内容保持一致即可
            shoppingCart = one;
        }
          //  shoppingCart 返回内容里面更新有几条了吗?????
        return R.success(shoppingCart);
        //  返回的 shoppingCart  决定了页面中怎么展示
    }

    /**
     * 查询购物车
     */
    @GetMapping("/list")
    public R<List<ShoppingCart>> list(){
        log.info("查询该用户的所有购物项");
        //先获取用户id 登录的用户
        Long userId = BaseContext.getCurrentId();

        //select * from shopping_cart where user_id = ?
        LambdaQueryWrapper<ShoppingCart> wrapper = new LambdaQueryWrapper<>();

        wrapper.eq(ShoppingCart::getUserId,userId);// select * from shopping_cart where user_id=用户id

        List<ShoppingCart> list = shoppingCartService.list(wrapper);

        return R.success(list);

    }


    /**
     * 清空购物车
     */
    @DeleteMapping("/clean")
    public R<String> clean(){
        log.info("清空该用户的所有购物项");
        //先获取用户id 登录的用户
        Long userId = BaseContext.getCurrentId();

        //delete from shopping_cart where user_id = ?
        LambdaQueryWrapper<ShoppingCart> wrapper = new LambdaQueryWrapper<>();

        wrapper.eq(ShoppingCart::getUserId,userId);// delete  from shopping_cart where user_id=用户id

        shoppingCartService.remove(wrapper);

        return R.success("清除成功");

    }

    /**
     *   根据 dish_id 或者 setmeal_id
     *      找到对应的购物项数据   购物项数据的 number-1
     *      减完之后  如果number是0  说明木有了
     *           数据库该删除了
     *      减完之后 不是0  说明  数量更新即可
     * @param shoppingCart
     * @return
     */
    @PostMapping("/sub")
    public R<ShoppingCart> sub(@RequestBody ShoppingCart shoppingCart){
        log.info("shoppingCart接收前端传递的购物项数据:"+shoppingCart);

        // 是不是 就开始解析 把shoppingCart存到数据库
        // shoppingCart数据不全
        // 1: 这个购物项属于谁 缺少 用户id
        // 用户指的是 当前登录的用户
        Long userId = BaseContext.getCurrentId();
        // 因为在登录校验哪里 存过id
        shoppingCart.setUserId(userId);
        // 创建一个 条件构造器
        LambdaQueryWrapper<ShoppingCart> wrapper = new LambdaQueryWrapper<>();
        // 不管下面两个sql语句是套餐还是菜品  都有   where user_id=用户id
        wrapper.eq(ShoppingCart::getUserId,userId);// select * from shopping_cart where user_id=用户id

        // 如果 添加的是 菜品 就拼接  and dish_id =?
        if(shoppingCart.getDishId()!=null){//就是菜品
            wrapper.eq(ShoppingCart::getDishId,shoppingCart.getDishId());
        }else{//就是套餐
            // 如果 添加的是 套餐 就拼接  and setmeal_id =?
            wrapper.eq(ShoppingCart::getSetmealId,shoppingCart.getSetmealId());
        }
        // 查询
        ShoppingCart one = shoppingCartService.getOne(wrapper);// 一个菜品id/套餐id 只有一个购物项
        // 其实如果没有并发操作  不用判断
         if(one==null){//兄嘚  你要减少的购物项 其实不存在
             throw  new CustomException("见鬼了...");
         }
        one.setNumber(one.getNumber()-1);// 把one对象中的 number 进行-  减少一份
        Integer number = one.getNumber();//获取到最新份数

        // 跟最近份数进行判断 做不同操作
        if(number==0){
            // 该购物项 没有分数 可以删除了
//            shoppingCartService.remove(wrapper);//  user_id=用户id and dish_id =?
              shoppingCartService.removeById(one.getId());
        }else {
            // 该购物项还有份数 保留 更新
              shoppingCartService.updateById(one);
        }

        return R.success(one);//把更新后的 购物项 给前端
        // number数据 一定要给前端 封装到   ShoppingCart one对象中
    }

}
